% 读取原始图像
image = (imread('pic_original.png'));
gray_image = (image); % 转换为灰度图像
left=235.*ones(h,50);
added=[left,image];
imwrite(added,"added.png");

% 高斯模糊（可选，平滑图像以减少噪声影响）
sigma = 2; % 模糊程度
smoothed_image = imgaussfilt(added, sigma);
imwrite(smoothed_image, 'smoothed_image.png'); % 保存平滑后的图像

% 初始化存储结果的结构体
edge_results = struct();

% 1. Sobel 边缘检测
edge_results.sobel = edge(smoothed_image, 'Sobel');
imwrite(edge_results.sobel, 'edges_sobel.png');

% 2. Prewitt 边缘检测
edge_results.prewitt = edge(smoothed_image, 'Prewitt');
imwrite(edge_results.prewitt, 'edges_prewitt.png');

% 3. Roberts 边缘检测
edge_results.roberts = edge(smoothed_image, 'Roberts');
imwrite(edge_results.roberts, 'edges_roberts.png');

% 4. Canny 边缘检测
edge_results.canny = edge(smoothed_image, 'Canny');
imwrite(edge_results.canny, 'edges_canny.png');

% 5. LoG (Laplacian of Gaussian)
edge_results.log = edge(smoothed_image, 'log');
imwrite(edge_results.log, 'edges_log.png');

% 6. Marr-Hildreth（基于 LoG）
hsize = [5 5]; % 滤波核大小
sigma_log = 2.0; % LoG 的标准差
h_log = fspecial('log', hsize, sigma_log); % 创建 LoG 滤波器
marr_filtered = imfilter(double(smoothed_image), h_log, 'replicate');
marr_edges = edge(marr_filtered, 'zerocross');
imwrite(marr_edges, 'edges_marr_hildreth.png');

% 显示边缘检测结果
figure;
subplot(2, 3, 1); imshow(edge_results.sobel); title('Sobel');
subplot(2, 3, 2); imshow(edge_results.prewitt); title('Prewitt');
subplot(2, 3, 3); imshow(edge_results.roberts); title('Roberts');
subplot(2, 3, 4); imshow(edge_results.canny); title('Canny');
subplot(2, 3, 5); imshow(edge_results.log); title('LoG');
subplot(2, 3, 6); imshow(marr_edges); title('Marr-Hildreth');

% 保存显示的结果为图像
saveas(gcf, 'edge_detection_comparison.png');


% 读取原始图像
image = imread('pic_original.png'); 
gray_image = (image); % 转换为灰度图像

% 高斯模糊（减少噪声影响）
sigma = 2; % 模糊程度
smoothed_image = imgaussfilt(gray_image, sigma);
imwrite(smoothed_image, 'smoothed_image.png'); % 保存平滑后的图像

% 计算水平梯度和垂直梯度
[Gx, Gy] = imgradientxy(smoothed_image);

% 计算梯度幅值和方向
[Gmag, Gdir] = imgradient(Gx, Gy);

% 保存结果
imwrite(mat2gray(Gx), 'gradient_horizontal.png'); % 水平梯度
imwrite(mat2gray(Gy), 'gradient_vertical.png');   % 垂直梯度
imwrite(mat2gray(Gmag), 'gradient_magnitude.png'); % 梯度幅值

% 显示结果
figure;
subplot(2, 2, 1); imshow(smoothed_image); title('Gaussian Smoothed');
subplot(2, 2, 2); imshow(mat2gray(Gx)); title('Horizontal Gradient (Gx)');
subplot(2, 2, 3); imshow(mat2gray(Gy)); title('Vertical Gradient (Gy)');
subplot(2, 2, 4); imshow(mat2gray(Gmag)); title('Gradient Magnitude');

% 保存显示的结果为图像
saveas(gcf, 'gradient_comparison.png');

